/**
 * 文件级注释：
 * 支付相关前端服务封装。
 * - 提供提现记录查询
 * - 提供平台报表数据、收款记录、今日营业额等统计查询
 * 统一遵循前端成功判断：接口返回值 `code === 0` 视为成功。
 */

import http from '../api/http'
import type { ApiResult } from './types'
import { isSuccess } from './types'

/**
 * 类级注释：报表类型枚举
 * - 0: 日报表
 * - 1: 周报表
 * - 2: 月报表
 */
export type ReportFormType = 0 | 1 | 2

/**
 * 类级注释：平台报表请求参数（与后端 PaymentController.GetReportForm 对齐）
 */
export interface ReportFormRequest {
  /** 报表类型：0=日报表 1=周报表 2=月报表 */
  reportFormType?: ReportFormType
  /** 查询日期时间（字符串或 Date） */
  selectDateTime?: string | Date
  /** 商户ID（可选） */
  merchantId?: string
  /** 门店ID（可选） */
  storeId?: string
}

/**
 * 类级注释：收款记录查询请求参数（与后端 PaymentController.GetCollectionRecordList 对齐）
 */
export interface CollectionRecordQuery {
  /** 开始日期（字符串或 Date） */
  beginTime: string | Date
  /** 结束日期（字符串或 Date） */
  endTime: string | Date
  /** 商户ID（可选） */
  merchantId?: string
  /** 门店ID（可选） */
  storeId?: string
  /** 收款码ID（可选） */
  codeId?: string
}

/**
 * 类级注释：报表响应中“趋势项”的基本结构
 */
export interface TrendItem {
  /** 区间开始时间 */
  StartTime: string
  /** 区间结束时间 */
  EndTime: string
  /** 金额（分）或计数，根据不同趋势含义 */
  Amount?: number
  /** 折扣订单数 */
  DiscountedOrderCount?: number
  /** 订单总数 */
  OrderCount?: number
}

/**
 * 类级注释：收款码排行榜项
 */
export interface PaymentCodeRankingItem {
  /** 收款码ID */
  PaymentCodeId: string
  /** 收款码编码 */
  Code: string
  /** 收款码名称 */
  PaymentCodeName: string
  /** 该码期间总金额（净收，分） */
  Amount: number
}

/**
 * 类级注释：平台报表响应数据结构（按后端 GetReportFormAsync 返回字段对齐）
 */
export interface ReportFormResponse {
  /** 实收（净收）金额（分） */
  ActualReceivedAmount: number
  /** 收款笔数 */
  CollectedCount: number
  /** 退款金额（分） */
  RefundAmount: number
  /** 退款笔数 */
  RefundCount: number
  /** 结算金额（分） */
  SettlementAmount: number
  /** 优惠金额（分） */
  CouponAmount: number
  /** 净收金额（分），= 实收 - 退款 */
  CollectedAmount: number
  /** 收入趋势（近7日/近4周/近6月） */
  IncomeComparisonStatistics: TrendItem[]
  /** 优惠订单趋势（各期折扣单数/订单总数） */
  DiscountedOrders: TrendItem[]
  /** 收款码排行榜 Top5 */
  PaymentCodeRanking: PaymentCodeRankingItem[]
  /** 微信渠道净收金额（分） */
  WechatAmount: number
  /** 微信渠道订单数 */
  WechatCount: number
  /** 支付宝渠道净收金额（分） */
  AlipayAmount: number
  /** 支付宝渠道订单数 */
  AlipayCount: number
  /** 分账对比趋势（结算金额口径） */
  DividedAmountComparisonStatistics: TrendItem[]
  /** 新老顾客对比趋势 */
  CustomerComparisonStatistics: Array<{
    StartTime: string
    EndTime: string
    NewCustomerCount: number
    OldCustomerCount: number
  }>
}

/**
 * 类级注释：平台首页数据响应结构（与后端 PaymentController.GetPlatformHomepage 对齐）
 * 字段含义：
 * - Commission：平台净佣金（分），= 订单佣金总和 - 过程手续费总和
 * - PlatformServiceFee：平台服务费（分），来自优惠券使用产生的服务费
 * - WithdrawalFee：提现手续费净收入（分），= 各笔提现手续费 - 固定成本（例如 20 分）
 * - SumAmount：平台净营收合计（分），= Commission + PlatformServiceFee + WithdrawalFee
 */
export interface PlatformHomepageResponse {
  /** 平台净佣金（分） */
  Commission: number
  /** 平台服务费（分） */
  PlatformServiceFee: number
  /** 提现手续费净收入（分） */
  WithdrawalFee: number
  /** 平台净营收合计（分） */
  SumAmount: number
}

/**
 * 函数级注释：规范化平台首页数据响应（camelCase -> PascalCase）
 * @param json 后端返回的 data 对象
 * @returns PlatformHomepageResponse 规范化后的平台首页数据
 * @throws 无显式抛出（内部进行空值保护）
 */
function normalizePlatformHomepageResponse(json: any): PlatformHomepageResponse {
  const d = json || {}
  return {
    Commission: typeof d.commission === 'number' ? d.commission : (d.Commission ?? 0),
    PlatformServiceFee: typeof d.platformServiceFee === 'number' ? d.platformServiceFee : (d.PlatformServiceFee ?? 0),
    WithdrawalFee: typeof d.withdrawalFee === 'number' ? d.withdrawalFee : (d.WithdrawalFee ?? 0),
    SumAmount: typeof d.sumAmount === 'number' ? d.sumAmount : (d.SumAmount ?? 0)
  }
}

/**
 * 类级注释：分账提现请求体（与后端 SplitWithdrawalRequestDto 对齐）
 * 说明：用于平台/商户维度发起分账提现。
 */
export interface SplitWithdrawalRequest {
  /** 商户ID（必填） */
  MerId: string
  /** 提现金额（单位分，必填） */
  Amount: number
}

/**
 * 类级注释：分账提现响应体（与后端 SplitWithdrawalResponseDto 的子集对齐）
 */
export interface SplitWithdrawalResponse {
  /** 渠道交易号 */
  TransactionNo?: string
  /** 提现金额（分） */
  Amount?: number
  /** 手续费（分） */
  Fee?: number
  /** 实际到账（分） */
  ActualAmount?: number
  /** 支付时间 */
  PayTime?: string
  /** 其他扩展字段 */
  [key: string]: any
}

/**
 * 类级注释：平台分账提现请求体（与后端 PaymentController.PlatformSplitWithdrawal 对齐）
 * 说明：平台方提现仅需要金额，单位为分。
 */
// 已与后端对齐：平台分账提现改为接收 long amount（单位分），无需 DTO

/**
 * 函数级注释：规范化“趋势项”数组（将后端 camelCase 字段映射为前端 PascalCase）
 * @param list 任意数组（后端返回的 `incomeComparisonStatistics` 等）
 * @returns TrendItem[] 规范化后的趋势项数组
 * @throws 无显式抛出（内部进行空值保护）
 */
function normalizeTrendItems(list: any[] | undefined): TrendItem[] {
  const src = Array.isArray(list) ? list : []
  return src.map((t: any) => ({
    StartTime: t?.startTime ?? t?.StartTime ?? '',
    EndTime: t?.endTime ?? t?.EndTime ?? '',
    Amount: typeof t?.amount === 'number' ? t.amount : (typeof t?.Amount === 'number' ? t.Amount : undefined),
    DiscountedOrderCount: typeof t?.discountedOrderCount === 'number' ? t.discountedOrderCount : (typeof t?.DiscountedOrderCount === 'number' ? t.DiscountedOrderCount : undefined),
    OrderCount: typeof t?.orderCount === 'number' ? t.orderCount : (typeof t?.OrderCount === 'number' ? t.OrderCount : undefined)
  }))
}

/**
 * 函数级注释：规范化“收款码排行榜”数组
 * @param list 后端返回的 `paymentCodeRanking` 数组
 * @returns PaymentCodeRankingItem[] 规范化后的排行榜数组
 * @throws 无显式抛出
 */
function normalizePaymentCodeRanking(list: any[] | undefined): PaymentCodeRankingItem[] {
  const src = Array.isArray(list) ? list : []
  return src.map((r: any) => ({
    PaymentCodeId: r?.paymentCodeId ?? r?.PaymentCodeId ?? '',
    Code: r?.code ?? r?.Code ?? '',
    PaymentCodeName: r?.paymentCodeName ?? r?.PaymentCodeName ?? '',
    Amount: typeof r?.amount === 'number' ? r.amount : (typeof r?.Amount === 'number' ? r.Amount : 0)
  }))
}

/**
 * 函数级注释：规范化平台报表响应（camelCase -> PascalCase）
 * @param json 后端返回的 data 对象
 * @returns ReportFormResponse 规范化后的报表响应
 * @throws 无显式抛出
 */
function normalizeReportFormResponse(json: any): ReportFormResponse {
  const d = json || {}
  return {
    ActualReceivedAmount: typeof d.actualReceivedAmount === 'number' ? d.actualReceivedAmount : (d.ActualReceivedAmount ?? 0),
    CollectedCount: typeof d.collectedCount === 'number' ? d.collectedCount : (d.CollectedCount ?? 0),
    RefundAmount: typeof d.refundAmount === 'number' ? d.refundAmount : (d.RefundAmount ?? 0),
    RefundCount: typeof d.refundCount === 'number' ? d.refundCount : (d.RefundCount ?? 0),
    SettlementAmount: typeof d.settlementAmount === 'number' ? d.settlementAmount : (d.SettlementAmount ?? 0),
    CouponAmount: typeof d.couponAmount === 'number' ? d.couponAmount : (d.CouponAmount ?? 0),
    CollectedAmount: typeof d.collectedAmount === 'number' ? d.collectedAmount : (d.CollectedAmount ?? 0),
    IncomeComparisonStatistics: normalizeTrendItems(d.incomeComparisonStatistics ?? d.IncomeComparisonStatistics),
    DiscountedOrders: normalizeTrendItems(d.discountedOrders ?? d.DiscountedOrders),
    PaymentCodeRanking: normalizePaymentCodeRanking(d.paymentCodeRanking ?? d.PaymentCodeRanking),
    WechatAmount: typeof d.wechatAmount === 'number' ? d.wechatAmount : (d.WechatAmount ?? 0),
    WechatCount: typeof d.wechatCount === 'number' ? d.wechatCount : (d.WechatCount ?? 0),
    AlipayAmount: typeof d.alipayAmount === 'number' ? d.alipayAmount : (d.AlipayAmount ?? 0),
    AlipayCount: typeof d.alipayCount === 'number' ? d.alipayCount : (d.AlipayCount ?? 0),
    DividedAmountComparisonStatistics: normalizeTrendItems(d.dividedAmountComparisonStatistics ?? d.DividedAmountComparisonStatistics),
    CustomerComparisonStatistics: Array.isArray(d.customerComparisonStatistics ?? d.CustomerComparisonStatistics)
      ? (d.customerComparisonStatistics ?? d.CustomerComparisonStatistics).map((c: any) => ({
          StartTime: c?.startTime ?? c?.StartTime ?? '',
          EndTime: c?.endTime ?? c?.EndTime ?? '',
          NewCustomerCount: typeof c?.newCustomerCount === 'number' ? c.newCustomerCount : (c?.NewCustomerCount ?? 0),
          OldCustomerCount: typeof c?.oldCustomerCount === 'number' ? c.oldCustomerCount : (c?.OldCustomerCount ?? 0)
        }))
      : []
  }
}

/**
 * 函数级注释：规范化“今日营业额”响应（camelCase -> PascalCase）
 * @param json 后端返回的 data 对象
 * @returns TodayTurnover 规范化后的今日营业额结构
 * @throws 无显式抛出
 */
function normalizeTodayTurnover(json: any): TodayTurnover {
  const d = json || {}
  return {
    TodayTurnover: typeof d.todayTurnover === 'number' ? d.todayTurnover : (d.TodayTurnover ?? 0),
    TodayTurnoverCount: typeof d.todayTurnoverCount === 'number' ? d.todayTurnoverCount : (d.TodayTurnoverCount ?? 0),
    RefundAmount: typeof d.refundAmount === 'number' ? d.refundAmount : (d.RefundAmount ?? 0),
    RefundAmountCount: typeof d.refundAmountCount === 'number' ? d.refundAmountCount : (d.RefundAmountCount ?? 0),
    CustomerCount: typeof d.customerCount === 'number' ? d.customerCount : (d.CustomerCount ?? 0),
    DirectRevenue: typeof d.directRevenue === 'number' ? d.directRevenue : (d.DirectRevenue ?? 0),
    DirectRevenueCount: typeof d.directRevenueCount === 'number' ? d.directRevenueCount : (d.DirectRevenueCount ?? 0),
    CooperativeRevenue: typeof d.cooperativeRevenue === 'number' ? d.cooperativeRevenue : (d.CooperativeRevenue ?? 0),
    CooperativeRevenueCount: typeof d.cooperativeRevenueCount === 'number' ? d.cooperativeRevenueCount : (d.CooperativeRevenueCount ?? 0),
    DiscountedRevenue: typeof d.discountedRevenue === 'number' ? d.discountedRevenue : (d.DiscountedRevenue ?? 0),
    DiscountedRevenueCount: typeof d.discountedRevenueCount === 'number' ? d.discountedRevenueCount : (d.DiscountedRevenueCount ?? 0),
    CooperativeDiscountedRevenue: typeof d.cooperativeDiscountedRevenue === 'number' ? d.cooperativeDiscountedRevenue : (d.CooperativeDiscountedRevenue ?? 0),
    CooperativeDiscountedRevenueCount: typeof d.cooperativeDiscountedRevenueCount === 'number' ? d.cooperativeDiscountedRevenueCount : (d.CooperativeDiscountedRevenueCount ?? 0)
  }
}

/**
 * 类级注释：收款记录项（与后端 GetCollectionRecordList 返回结构对齐）
 */
export interface CollectionRecordItem {
  /** 日期（天） */
  DayDate: string
  /** 净收金额（分） */
  CollectedAmount: number
  /** 收款笔数 */
  CollectedCount: number
  /** 顾客数（去重） */
  CustomerCount: number
}

/**
 * 类级注释：今日营业额响应结构（与后端 GetTodayTurnover 对齐）
 */
export interface TodayTurnover {
  /** 今日营业额（分，净收） */
  TodayTurnover: number
  /** 今日收款笔数 */
  TodayTurnoverCount: number
  /** 今日退款金额（分） */
  RefundAmount: number
  /** 今日退款笔数 */
  RefundAmountCount: number
  /** 今日顾客数（去重） */
  CustomerCount: number
  /** 直接营收金额（无优惠券、无分账） */
  DirectRevenue: number
  /** 直接营收笔数 */
  DirectRevenueCount: number
  /** 合作营收金额（无优惠券、有分账） */
  CooperativeRevenue: number
  /** 合作营收笔数 */
  CooperativeRevenueCount: number
  /** 折扣营收金额（有优惠券、无分账） */
  DiscountedRevenue: number
  /** 折扣营收笔数 */
  DiscountedRevenueCount: number
  /** 合作折扣营收金额（有优惠券、有分账） */
  CooperativeDiscountedRevenue: number
  /** 合作折扣营收笔数 */
  CooperativeDiscountedRevenueCount: number
}

/**
 * 类级注释：提现记录响应类型（与后端 WithdrawalRecord 对齐，字段可选以兼容）
 */
export interface WithdrawalRecord {
  /** 提现记录ID */
  Id?: string
  /** 用户ID */
  UserId?: string
  /** 提现金额（分） */
  Amount?: number
  /** 手续费（分） */
  Fee?: number
  /** 实际到账（分） */
  ActualAmount?: number
  /** 商户ID */
  MerchantId?: string
  /** 提现状态：0处理中，1成功，2失败 */
  WithdrawalStatus?: number
  /** 支付时间 */
  PayTime?: string
  /** 创建时间 */
  CreationTime?: string
  /** 渠道交易号 */
  TransactionNo?: string
  /** 过程手续费 */
  ProcedureFee?: number
  /** 其他拓展字段 */
  [key: string]: any
}

/**
 * 类级注释：支付服务类
 * 提供提现记录列表查询等方法。
 */
export class PaymentService {
  /**
   * 函数级注释：获取当前登录用户的提现记录列表
   * @param page 页码，默认 1
   * @param limit 每页条数，默认 10
   * @returns ApiResult<{ total: number; data: WithdrawalRecord[] }>
   * @throws 可能抛出网络请求异常
   */
  static async getWithdrawalRecordList(page: number = 1, limit: number = 10): Promise<ApiResult<{ total: number; data: WithdrawalRecord[] }>> {
    const resp = await http.get<ApiResult<{ total: number; data: WithdrawalRecord[] }>>('/Payment/GetWithdrawalRecordList', { params: { page, limit } })
    return resp.data
  }

  /**
   * 函数级注释：获取平台报表数据
   * @param params 报表查询参数
   * @returns ApiResult<ReportFormResponse> 返回平台报表数据集合
   * @throws 可能抛出网络请求或服务端异常
   */
  static async getReportForm(params: ReportFormRequest): Promise<ApiResult<ReportFormResponse>> {
    const { reportFormType = 0, selectDateTime, merchantId = '', storeId = '' } = params || {}
    const resp = await http.get<ApiResult<any>>('/Payment/GetReportForm', {
      params: {
        reportFormType,
        selectDateTime: selectDateTime instanceof Date ? selectDateTime.toISOString() : selectDateTime,
        merchantId,
        storeId
      }
    })
    const raw = resp.data
    const mapped = isSuccess(raw) && raw.data ? normalizeReportFormResponse(raw.data) : undefined
    return { ...raw, data: mapped } as ApiResult<ReportFormResponse>
  }

  /**
   * 函数级注释：获取收款记录列表（按天聚合）
   * @param params 查询请求参数（含日期范围、可选商户/门店/收款码）
   * @returns ApiResult<CollectionRecordItem[]> 返回按天聚合的收款记录列表
   * @throws 可能抛出网络请求或服务端异常
   */
  static async getCollectionRecordList(params: CollectionRecordQuery): Promise<ApiResult<CollectionRecordItem[]>> {
    const { beginTime, endTime, merchantId = '', storeId = '', codeId = '' } = params
    const resp = await http.get<ApiResult<CollectionRecordItem[]>>('/Payment/GetCollectionRecordList', {
      params: {
        beginTime: beginTime instanceof Date ? beginTime.toISOString() : beginTime,
        endTime: endTime instanceof Date ? endTime.toISOString() : endTime,
        merchantId,
        storeId,
        codeId
      }
    })
    return resp.data
  }

  /**
   * 函数级注释：获取今日营业额与结构
   * @param merchantId 商户ID（可选）
   * @param storeId 门店ID（可选）
   * @param codeId 收款码ID（可选）
   * @returns ApiResult<TodayTurnover> 返回今日营业额、笔数、退款与营收结构
   * @throws 可能抛出网络请求或服务端异常
   */
  static async getTodayTurnover(merchantId: string = '', storeId: string = '', codeId: string = ''): Promise<ApiResult<TodayTurnover>> {
    const resp = await http.get<ApiResult<any>>('/Payment/GetTodayTurnover', {
      params: { merchantId, storeId, codeId }
    })
    const raw = resp.data
    const mapped = isSuccess(raw) && raw.data ? normalizeTodayTurnover(raw.data) : undefined
    return { ...raw, data: mapped } as ApiResult<TodayTurnover>
  }

  /**
   * 函数级注释：获取平台首页数据（净营收等）
   * @param date 查询日期（默认当前日期）；后端接受 `dateTime` 参数，若未启用日期过滤仍可传递
   * @returns ApiResult<PlatformHomepageResponse> 返回平台净营收相关数据
   * @throws 可能抛出网络请求或服务端异常
   */
  static async getPlatformHomepage(date: string | Date = new Date()): Promise<ApiResult<PlatformHomepageResponse>> {
    const resp = await http.get<ApiResult<any>>('/Payment/GetPlatformHomepage', {
      params: {
        dateTime: date instanceof Date ? date.toISOString() : date
      }
    })
    const raw = resp.data
    const mapped = isSuccess(raw) && raw.data ? normalizePlatformHomepageResponse(raw.data) : undefined
    return { ...raw, data: mapped } as ApiResult<PlatformHomepageResponse>
  }

  /**
   * 函数级注释：发起分账提现
   * @param dto 请求体参数
   *  - MerId：商户ID（必填）
   *  - Amount：提现金额（单位分，必填）
   * @returns ApiResult<SplitWithdrawalResponse> 返回后端统一结构
   * @throws 可能抛出网络请求异常（axios 错误）
   * 异常：返回值 code !== 0 时视为失败，前端应提示 message
   */
  static async splitWithdrawal(dto: SplitWithdrawalRequest): Promise<ApiResult<SplitWithdrawalResponse>> {
    const resp = await http.post<ApiResult<SplitWithdrawalResponse>>('/Payment/SplitWithdrawal', dto)
    return resp.data
  }

  /**
   * 函数级注释：发起平台分账提现
   * @param dto 请求体参数
   *  - Amount：提现金额（单位分，必填）
   * @returns ApiResult<SplitWithdrawalResponse> 返回后端统一结构
   * @throws 可能抛出网络请求异常（axios 错误）
   * 异常：返回值 code !== 0 时视为失败，前端应提示 message
   */
  /**
   * 函数级注释：发起平台分账提现（后端签名 PlatformSplitWithdrawal(long amount)）
   * @param amount 以分为单位的提现金额（整数，推荐不超过 Number 安全范围）
   * @returns ApiResult<SplitWithdrawalResponse> 返回后端统一结构体
   * @throws 可能抛出网络请求异常（axios 错误）
   * 异常：返回值 code !== 0 时视为失败，前端应提示 message
   */
  static async platformSplitWithdrawal(amount: number): Promise<ApiResult<SplitWithdrawalResponse>> {
    // 由于后端为原始类型 long amount，且未标注 FromBody，这里以 query 方式传参
    const resp = await http.post<ApiResult<SplitWithdrawalResponse>>('/Payment/PlatformSplitWithdrawal', null, {
      params: { amount }
    })
    return resp.data
  }
}
